#include <header.h>
// 命令枚举
typedef enum{
    cd,  
    ls,
    upload, // 上传
    download, // 下载
    rm,
    pwd,
    create_dir, // 创建目录
    login,
    regis // 注册
}CMD;
typedef struct client_status_s{
    int socket_fd;
    int login_status;
    char *user;
    char *password;
    char *path;
    char *runtime_cmd;
}client_status_t;     
// 自定义协议
typedef struct self_defined_pro_s{
    int cmd; // 命令
    int para_num; // 信息中参数的个数（以键值对的方式存在）
    int message_len; // 信息的长度
    char message[1024]; // 信息内容
}self_defined_pro_t;

typedef struct queue_s{
    int *fd; // 整型数组队列
    int front; // 队头
    int rear; // 队尾
    int size; //  队列大小
    int capacity; //  队列容量
}queue_t; 
typedef struct status_s{
    pthread_t *pthreads; // 线程id数组
    queue_t q; // 队列:存储socketfd
    pthread_mutex_t lock; //锁
    pthread_cond_t cond; //条件变量
    int end_flag;        //结束标记
}status_t;

//解析配置文件
// 定义一个结构体来存储配置信息
typedef struct {
    char ip[20];//IP地址
    char port[20];//端口号
    char file[100];//文件路径
    char mysql_user[100];//MYSQL用户名
} Config;



//初始化多个线程
int initPthreads(status_t *status,int num);

//初始化socket_fd
int initSocketfd(int *socket_fd,char *ip,char *port);

//初始化一个epollfd
int initEpollfd(int *epoll_fd);

//epoll添加监听
int epoll_add(int epoll_fd,int fd);

//队列添加fd
void enqueue(queue_t *q,int net_fd);

//获取队头元素并出队
int dequeue(queue_t *q);

//线程入口函数
void *func(void *p);

//任务处理方法
int doWork(int net_fd);

// cd命令
void do_cd(int net_fd, self_defined_pro_t *protect);

// ls命令
void do_ls(int net_fd, self_defined_pro_t *protect);

// upload
int server_upload(int net_fd,self_defined_pro_t *mes);

// download
int server_download(int net_fd,self_defined_pro_t *msg);

// rm命令
void do_rm(int net_fd, self_defined_pro_t *protect);

// pwd命令
void do_pwd();

// create_dir 
int server_mkdir(int net_fd,self_defined_pro_t *mes);

int server_login(int net_fd,self_defined_pro_t *mes);

int server_register(int net_fd,self_defined_pro_t *mes);

//登录
int server_menu(int net_fd,self_defined_pro_t *mes);
void read_log_file(char *ip,char *port);
int initsocket(int *socket_fd);


// 函数声明
Config load_config();
